# -*- coding:utf-8 -*-
import tushare as ts  # 获取基金数据
import datetime  # 日期处理
import operator # 函数应用
from ycdl.obj import FundProfit


# 交易日期
trade_date = []
# 收盘价
close = []

week_day_dict = {
    0: '星期一',
    1: '星期二',
    2: '星期三',
    3: '星期四',
    4: '星期五',
    5: '星期六',
    6: '星期天',
}

# 获取基金数据
def get_data(ts_code, start_date, end_date):
    # ts.set_token("{token}")
    pro = ts.pro_api("{token}")
    df = pro.fund_daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
    print(df)
    return df


# 每周定投
def weekModel(money, time):
    obj = FundProfit()
    obj.invModel = '每周定投'
    obj.everyMoney = money

    # 获取星期几
    week_day = week_day_dict.get(time)

    obj.chooseTime = week_day

    # 定义一个份额的列表
    fene_list = []

    final_price = 0


    # 循环日期，注意 倒序, 也可以使用reversed()
    for i in  range(len(trade_date) - 1, -1, -1):
        # 把数据中的日期转换为星期
        date = trade_date[i]
        week_day_num = datetime.datetime.strptime(date, '%Y%m%d').date().weekday()
        week_day_1 = week_day_dict.get(week_day_num)
        # 如果星期一致
        if week_day_1 == week_day:
            # 标记选取的日期, 这一期投了钱
            obj.date_list.append(date)
            # 添加每期的份额  用投入的钱 / 收盘价 = 份额
            fene_list.append(round(money / close[i], 3))
            # 选取最后一次的价格作为出盘价格， 每次都会选取 但都会被覆盖
            final_price = close[i]
            # 每期收益率  （份额 * 出售时最终价）- 投入资金
            obj.eveyProfit.append(round((sum(fene_list) * final_price - len(obj.date_list) * money), 3))

    # 期数
    obj.numberPeriods = len(obj.date_list)
    # 共计投入
    obj.totalInvestment = len(obj.date_list) * money
    # 总份额
    obj.totalShare = sum(fene_list)
    # 卖出总金额
    obj.lastProfit = round((final_price * obj.totalShare), 3)
    # 收益
    obj.profit = obj.lastProfit - obj.totalInvestment
    return obj

# 每月定投
def monthModel(money, time):
    obj = FundProfit()
    obj.invModel = '每月定投'

    obj.everyMoney = money

    # 对时间做处理， 我们前台的数据要加 1
    time += 1
    if time < 10:
        time = '0' + str(time)

    obj.chooseTime = time

    # 定义一个份额的列表
    fene_list = []

    final_price = 0

    # 循环日期，注意 倒序, 也可以使用reversed()
    for i in range(len(trade_date) - 1, -1, -1):
        # 把数据中的日期转换为一月中的某一天
        date = trade_date[i]
        day = date[6:]
        # 如果日期一致
        if day == time:
            # 标记选取的日期, 这一期投了钱
            obj.date_list.append(date)
            # 添加每期的份额  用投入的钱 / 收盘价 = 份额
            fene_list.append(round(money / close[i], 3))
            # 选取最后一次的价格作为出盘价格， 每次都会选取 但都会被覆盖
            final_price = close[i]
            # 每期收益率  （份额 * 出售时最终价）- 投入资金
            obj.eveyProfit.append(round((sum(fene_list) * final_price - len(obj.date_list) * money), 3))

    # 期数
    obj.numberPeriods = len(obj.date_list)
    # 共计投入
    obj.totalInvestment = len(obj.date_list) * money
    # 总份额
    obj.totalShare = sum(fene_list)
    # 卖出总金额
    obj.lastProfit = round((final_price * obj.totalShare), 3)
    # 收益
    obj.profit = obj.lastProfit - obj.totalInvestment
    return obj

# 每天定投
def dayModel(money):
    obj = FundProfit()
    obj.invModel = '每日定投'
    obj.everyMoney = money

    # 定义一个份额的列表
    fene_list = []

    final_price = 0

    # 循环日期，注意 倒序, 也可以使用reversed()
    for i in range(len(trade_date) - 1, -1, -1):
        date = trade_date[i]
        # 标记选取的日期, 这一期投了钱
        obj.date_list.append(date)
        # 添加每期的份额  用投入的钱 / 收盘价 = 份额
        fene_list.append(round(money / close[i], 3))
        # 选取最后一次的价格作为出盘价格， 每次都会选取 但都会被覆盖
        final_price = close[i]
        # 每期收益率  （份额 * 出售时最终价）- 投入资金
        obj.eveyProfit.append(round((sum(fene_list) * final_price - len(obj.date_list) * money), 3))

    # 期数
    obj.numberPeriods = len(obj.date_list)
    # 共计投入
    obj.totalInvestment = len(obj.date_list) * money
    # 总份额
    obj.totalShare = sum(fene_list)
    # 卖出总金额
    obj.lastProfit = round((final_price * obj.totalShare), 3)
    # 收益
    obj.profit = obj.lastProfit - obj.totalInvestment
    return obj


# 最优
def catchProfit(money, time):
    # 定义比较规则
    comare = operator.attrgetter('profit')

    # 每天投
    day = dayModel(money)
    # 每周投
    weeks = []
    for i in range(5):
        weeks.append(weekModel(money, i))
    weeks.sort(key=comare)
    week = weeks[len(weeks) - 1]

    #按月投
    months = []
    for i in range(31):
        months.append(monthModel(money, i))
    months.sort(key=comare)
    month = months[len(months) - 1]

    # 最佳
    all = []
    all.append(day)

    all.append(week)

    all.append(month)

    all.sort(key=comare)

    profect = all[len(all) - 1]

    return profect


if __name__ == '__main__':
    o1 = {'name': 'zhangsan', 'age': 18}
    o2 = {'name': 'lisi', 'age': 16}
    o3 = {'name': 'wangwu', 'age': 20}
    objs = [o1, o2, o3]
    comare = operator.attrgetter('age')
    objs.sort(key=comare)
    for i in objs:
        print(i)